home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2007 December
/
PCWKCD1207B.iso
/
+ TYLKO W WERSJI CYFROWEJ +
/
PCWK_PROG
/
Source
/
120
/
ukryte3
/
fukryte3.cpp
next >
Wrap
C/C++ Source or Header
|
2007-07-05
|
9KB
|
291 lines
//
// Andrzej Stasiewicz, czerwiec, 2007
// Ukrywanie obrazu w obrazie
// Oszacowanie miejsca w tajnym schowku
// Skonstruowanie nag│≤wka
// Wpisanie nag│≤wka i obrazu w m│odsze bity obrazu - no£nika
//
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "fukryte3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
il_r = il_g = il_b = 3; //stan pocz╣tkowy pojemno£ci schowka uzgodniono z edytorkami
id = 1234; //identyfikator te┐ uzgodniono z pocz╣tkowym tekstem w edytorku
}
//---------------------------------------------------------------------------
// Odczyt pliku, wy£wietlenie z lewej strony, wyr≤wnanie parametr≤w
// obrazu docelowego, oszacowanie pojemno£ci schowka
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if( OpenPictureDialog1 -> Execute())
{
Image1 -> Picture -> LoadFromFile( OpenPictureDialog1 -> FileName);
Image1 -> Picture -> Bitmap -> PixelFormat = pf32bit;
Image3 -> Picture -> Bitmap -> PixelFormat = pf32bit;
int szer = Image1 -> Picture -> Bitmap -> Width;
int wys = Image1 -> Picture -> Bitmap -> Height;
Image3 -> Picture -> Bitmap -> Width = szer;
Image3 -> Picture -> Bitmap -> Height = wys;
int rozmiar = szer * wys * ( il_r + il_g + il_b) / 8;
Label4 -> Caption = "Przestrze± dostΩpna: " + String( rozmiar);
}
}
//---------------------------------------------------------------------------
// Odczyt pliku ukrywanego, wykazanie jego rozmiaru powiΩkszonego o nag│≤wek
// Uwaga - uwzglΩdniono rozmiar nag│≤wka = 16 + 16 + 16 + 8 + 8 + 8 = 72 bity = 9 bajt≤w
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if( OpenPictureDialog1 -> Execute())
{
Image2 -> Picture -> LoadFromFile( OpenPictureDialog1 -> FileName);
Image2 -> Picture -> Bitmap -> PixelFormat = pf32bit;
int szer = Image2 -> Picture -> Bitmap -> Width;
int wys = Image2 -> Picture -> Bitmap -> Height;
int rozmiar = szer * wys * 4 + 9;
Label5 -> Caption = "Przestrze± wymagana: " + String( rozmiar);
}
}
//---------------------------------------------------------------------------
// Oszacowanie dostΩpnej przestrzeni
// Ukrywanie obrazka Image2 w obrazku Image1
// i pokazanie wyniku w Image3.
// Najpierw Image1 jest kopiowany do Image3.
// Potem okre£lone bity Image3 s╣ modyfikowane.
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Image3 -> Picture -> Bitmap = Image1 -> Picture -> Bitmap;
int i, j, szer, wys;
TColor k;
unsigned char r, g, b;
zapisz_naglowek(); //zapisanie kodu rozpoznawczego, szerokosci, wysokosci i ilosci wykradanych bit≤w
szer = Image2 -> Picture -> Bitmap -> Width;
wys = Image2 -> Picture -> Bitmap -> Height;
for( i = 0; i < szer; ++i)
{
for( j = 0; j < wys; ++j)
{
k = Image2 -> Picture -> Bitmap -> Canvas -> Pixels[ i][ j];
r = GetRValue( k);
if( !zapisz_bajt( r))
return;
g = GetGValue( k);
if( !zapisz_bajt( g))
return;
b = GetBValue( k);
if( !zapisz_bajt( b))
return;
}
}
}
//---------------------------------------------------------------------------
// Zapis ostatecznego obrazka do pliku
void __fastcall TForm1::Button4Click(TObject *Sender)
{
if( SavePictureDialog1 -> Execute())
{
Image3 -> Picture -> SaveToFile( SavePictureDialog1 -> FileName);
}
}
//---------------------------------------------------------------------------
// Funkcja elementarna.
// oddaj stan 0, 1, zgodnie z bitem poz w bajcie bajt
int TForm1 :: daj_bit( unsigned char bajt, int poz)
{
int bit;
unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128}; //binarnie: '1', '10', '100', '1000', ...
if( bajt & maska[ poz])
bit = 1;
else
bit = 0;
return bit;
}
//---------------------------------------------------------------------------
// Funkcja elementarna.
// W bajcie 'bajt' nadaj bitowi 'poz' wartosc 'bit'
unsigned char TForm1 :: ustaw_bit( unsigned char bajt, int poz, int bit)
{
unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128}; //'1', '10', '100', '1000', ...
if( bit == 1) //wpisywanie jedynki
{
bajt = bajt | maska[ poz];
}
else
{
bajt = bajt & (~maska[ poz]);
}
return bajt;
}
//---------------------------------------------------------------------------
// Zapisz wartosc bit (=0, 1) w bie┐╣cym bicie obrazka g│≤wnego Image3
// (kt≤ry jest kopi╣ Image1)
// Dokonaj przesuniΩcia wskaƒnik≤w pozycji bie┐╣cego bitu w Image3
// return: true - zapisano,
// false - koniec obrazka g│≤wnego.
bool TForm1 :: zapisz_bit( int bit)
{
int szer = Image3 -> Picture -> Bitmap -> Width;
int wys = Image3 -> Picture -> Bitmap -> Height;
if( Y_POZ > wys)
return false; //koniec przestrzeni do zapisu
TColor k = Image3 -> Picture -> Bitmap -> Canvas -> Pixels[ X_POZ][ Y_POZ];
unsigned char r = GetRValue( k);
unsigned char g = GetGValue( k);
unsigned char b = GetBValue( k);
switch( RGB_POZ)
{
case 0:
r = ustaw_bit( r, BIT_POZ, bit);
break;
case 1:
g = ustaw_bit( g, BIT_POZ, bit);
break;
case 2:
b = ustaw_bit( b, BIT_POZ, bit);
break;
}
k = RGB( r, g, b);
Image3 -> Picture -> Bitmap -> Canvas -> Pixels[ X_POZ][ Y_POZ] = k;
BIT_POZ ++; //nastΩpny wskaƒniki na nastΩpny bit ...
if( RGB_POZ == 0) //... ale czy mie£ci siΩ w kanale R?
{
if( BIT_POZ >= il_r)
{
BIT_POZ = 0;
RGB_POZ = 1; //... je£li nie, przejdƒmy do kana│u G...
}
}
if( RGB_POZ == 1) //... ale czy mie£ci siΩ w kanale G? ...
{
if( BIT_POZ >= il_g)
{
BIT_POZ = 0;
RGB_POZ = 2; //... je£li nie, przejdƒmy do kana│u B ...
}
}
if( RGB_POZ == 2) //... ale czy mie£ci siΩ w kanale B? ...
{
if( BIT_POZ >= il_b)
{
BIT_POZ = 0;
RGB_POZ = 0;
X_POZ ++; //... je£li nie, przejdƒmy do nastΩpnego piksela
if( X_POZ >= szer)
{
X_POZ = 0;
Y_POZ ++;
}
}
}
return true;
}
//---------------------------------------------------------------------------
// 8-krotne wywo│anie powy┐szej zapisz_bit()
bool TForm1 :: zapisz_bajt( unsigned char bajt)
{
int i, bit;
for( i = 0; i < 8; ++i)
{
bit = daj_bit( bajt, i);
if( !zapisz_bit( bit))
return false;
}
return true;
}
//---------------------------------------------------------------------------
// Zapisanie kodu rozpoznawczego, szerokosci, wysokosci i ilosci wykradanych bit≤w
// Uwaga - nag│≤wek jest zapisywany zawsze na 2 bitach w kana│ach R, G, B
// Z tego powodu na moment zmieniamy stany il_r, il_g, il_b na 2
bool TForm1 :: zapisz_naglowek( void)
{
X_POZ = 0; //start
Y_POZ = 0;
RGB_POZ = 0;
BIT_POZ = 0;
int szer = Image2 -> Picture -> Bitmap -> Width;
int wys = Image2 -> Picture -> Bitmap -> Height;
unsigned char id_hi = id >> 8; //bajty do zapisu
unsigned char id_lo = id;
unsigned char szer_hi = szer >> 8;
unsigned char szer_lo = szer;
unsigned char wys_hi = wys >> 8;
unsigned char wys_lo = wys;
unsigned char il_ra = il_r;
unsigned char il_ga = il_g;
unsigned char il_ba = il_b;
il_r = il_g = il_b = 2; //umowa - nag│≤wek wykrada ZAWSZE po 2 bity
if( !zapisz_bajt( id_hi))
return false;
if( !zapisz_bajt( id_lo))
return false;
if( !zapisz_bajt( szer_hi))
return false;
if( !zapisz_bajt( szer_lo))
return false;
if( !zapisz_bajt( wys_hi))
return false;
if( !zapisz_bajt( wys_lo))
return false;
if( !zapisz_bajt( il_ra))
return false;
if( !zapisz_bajt( il_ga))
return false;
if( !zapisz_bajt( il_ba))
return false;
il_r = il_ra;
il_g = il_ga;
il_b = il_ba; //koniec umowy - wracamy do ustawie± u┐ytkownika
return true;
}
//---------------------------------------------------------------------------
// Zmieniono nastawy edytork≤w - identyfikatora i rozmiar≤w schowka
void __fastcall TForm1::Edit3Exit(TObject *Sender)
{
il_r = Edit1 -> Text.ToInt(),
il_g = Edit2 -> Text.ToInt(),
il_b = Edit3 -> Text.ToInt();
id = Edit4 -> Text.ToInt();
int szer = Image1 -> Picture -> Bitmap -> Width;
int wys = Image1 -> Picture -> Bitmap -> Height;
int rozmiar = szer * wys * ( il_r + il_g + il_b) / 8;
Label4 -> Caption = "Przestrze± dostΩpna: " + String( rozmiar);
}
//---------------------------------------------------------------------------